package org.twf.aicodehelper.service;

import dev.langchain4j.service.MemoryId;
import dev.langchain4j.service.Result;
import dev.langchain4j.service.SystemMessage;
import dev.langchain4j.service.UserMessage;
import dev.langchain4j.service.guardrail.InputGuardrails;
import org.twf.aicodehelper.config.ai.guardrail.SafeInputGuardrail;
import reactor.core.publisher.Flux;

import java.util.List;

// AiService注解：将接口方法定义为AI服务，并生成相应的代理类。
//@AiService
@InputGuardrails({SafeInputGuardrail.class})
public interface IAiCodeHelperMemoryService {

    /**
     * 带会话记忆的聊天 无MemoryId
     *
     * @param message
     * @return
     */
    @SystemMessage(fromResource = "system-prompt.txt")
    String chatWithMemory(String message);

    /**
     * 带会话记忆的聊天
     * 多个用户需要依赖memoryId隔离消息
     *
     * @return AI回复
     */
    String chatWithMemoryId(@MemoryId String memoryId, @UserMessage String message);

    /**
     * 带会话记忆的聊天
     * 由多个用户需要隔离消息
     * 记录，java14引入的特性，使用record定义
     * 会自动生成构造函数、getter方法、equals方法、toString方法，hashCode方法
     *
     * @return AI回复
     */
    Report report(@MemoryId String memoryId, @UserMessage String userMessage);

    /**
     * 带会话记忆的聊天
     * 由多个用户需要隔离消息
     * 记录，java14引入的特性，使用record定义
     * 会自动生成构造函数、getter方法、equals方法、toString方法，hashCode方法
     *
     * @param name           会话标题
     * @param suggestionList 建议列表
     * @return AI回复
     */
    record Report(String name, List<String> suggestionList) {
    }


    /**
     * 返回封装后的结果，包含检索的原文档
     *
     * @param memoryId
     * @param message
     * @return
     */
    Result<String> chatWithRag(@MemoryId String memoryId, @UserMessage String message);


    /**
     * 流式输出
     * @param message
     * @return
     */
    Flux<String> chatStream(@MemoryId String memoryId, @UserMessage String message);
}
